package com.lost.octopus.es.helper.util;

import com.lost.octopus.es.helper.constant.ParameterConstant;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import lombok.extern.log4j.Log4j2;
import org.springframework.util.CollectionUtils;

/**
 * 数组工具
 * @author zhangbh
 **/
@Log4j2
public class ArrayUtil {

    /**
     * 判断为空
     * @param arr 数组
     * @param <T> 类型
     * @return 是否为空
     */
    public static <T> boolean isNull(T[] arr) {
        return arr == null || arr.length == 0;
    }

    /**
     * 判断不为空
     * @param arr 数组
     * @param <T> 类型
     * @return 是否为空
     */
    public static <T> boolean isNotNull(T[] arr) {
        return !isNull(arr);
    }


    /**
     * 转换数组
     * @param val 值
     * @return 数组
     */
    public static List<Object> toList(Object val) {
        if (val == null) {
            return new ArrayList<>();
        }
        if (!val.getClass().isArray()) {
            return new ArrayList<>();
        }
        Object[] values = (Object[]) val;
        return Arrays.asList(values);
    }

    /**
     * 检查并转换成列表
     * 抛出异常条件：
     * 不是数组也不是字符串
     * 数组数量为0
     * @param value 值
     */
    public static List<Object> transList(Object value) {
        // 支持字符串（逗号隔开）和数组类型格式
        if (value instanceof String) {
            value = ((String) value).split(ParameterConstant.SEPARATOR);
        }
        if (value instanceof Collection) {
            return getArrays((Collection<?>) value);
        }
        if (!(value.getClass().isArray())) {
            log.error("多值必须是数组或者是逗号隔开的字符串");
            throw new IllegalArgumentException("多值必须是数组或者是逗号隔开的字符串");
        }
        return toList(value);
    }

    static ArrayList<Object> getArrays(Collection<?> value) {
        if (CollectionUtils.isEmpty(value)) {
            return new ArrayList<>();
        }
        ArrayList<Object> list = new ArrayList<>(value);
        for (int i = 0; i < list.size(); i++) {
            Object o = list.get(i);
            if (o instanceof LocalDateTime) {
                list.set(i, DateUtil.toString((LocalDateTime) o));
            }
            if (o instanceof LocalDate) {
                list.set(i, DateUtil.toString((LocalDate) o));
            }
        }
        return list;
    }
}
